package com.agenda.server.recebedores;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import com.agenda.comum.ObjectRecebedorInformacao;
import com.agenda.controller.CompromissoController;
import com.agenda.model.AnexoCompromisso;
import com.agenda.model.Compromisso;
import com.agenda.model.Convite;
import com.agenda.model.RespostaRequisicao;
import com.agenda.util.FileUtil;
import com.agenda.util.StringUtils;

public class ReceberCompromissoRecebedor extends ObjectRecebedorInformacao {

	@Override
	public void receber(ObjectInputStream objectInput) throws Exception {
		Compromisso compromisso = (Compromisso) objectInput.readObject();
		System.out.println("Compromisso que chegou no servidor - " + compromisso);
		try {
			File pasta = new File("/ANEXOS/" + System.currentTimeMillis());

			for (AnexoCompromisso anexo : compromisso.getAnexos()) {

				if (!anexo.isNoSevidor()) {

					if (!pasta.exists())
						pasta.mkdirs();

					System.out.println("Arquivo atual " + anexo.getNome());
					BufferedInputStream bufferInput = new BufferedInputStream(sck.getInputStream(), 1024);
					File file = new File(pasta.getAbsolutePath() + "/" + anexo.getNome());
					BufferedOutputStream fileOutputStream = new BufferedOutputStream(new FileOutputStream(file));

					FileUtil.receber(fileOutputStream, bufferInput, sck.getOutputStream());

					fileOutputStream.flush();
					fileOutputStream.close();

					anexo.setCaminho(file.getAbsolutePath());
					anexo.setNoSevidor(true);

					confirmarRecebimentoArquivo();
				}
			}

			boolean ehNovo = (compromisso.getId().intValue() == 0);
			//TODO VERIFICAR SE TEVE CHOQUE DE ACESSO

			CompromissoController.getINSTANCIA().gravar(compromisso);

			//pasta.renameTo(new File(compromisso.getId().toString()));

			if (ehNovo)
				enviarEmail(compromisso);

			resposta = new RespostaRequisicao(false, "");

		} catch (Exception e) {
			e.printStackTrace();
			resposta = new RespostaRequisicao(true, e.getMessage());
		}
	}

	private void confirmarRecebimentoArquivo() {
		try {
			System.out.println("Enviando confirmação de recebimento");
			sck.getOutputStream().write(1);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void enviarEmail(Compromisso compromisso) throws Exception {
		//email :miconcorrenciaconectividademur@gmail.com
		//senha :concorrencia

		if (compromisso.getConvites().isEmpty())
			return;

		InternetAddress[] address = new InternetAddress[compromisso.getConvites().size()];
		int i = 0;
		for (Convite convite : compromisso.getConvites()) {
			address[i] = new InternetAddress(convite.getUsuario().getLoginEmail());
			i++;
		}

		StringBuilder mensagem = new StringBuilder();
		mensagem.append("Você foi convidado para o compromisso do dia ");
		mensagem.append(StringUtils.toStr(compromisso.getDataInicial(), "dd/MM/yyyy"));
		mensagem.append(" por ").append(compromisso.getProprietario().getLoginEmail());

		Properties props = new Properties();

		props.put("mail.smtp.auth", "true");
		props.put("mail.smtp.starttls.enable", "true");
		props.put("mail.smtp.host", "smtp.gmail.com");
		props.put("mail.smtp.port", "587");

		Authenticator autenticador = new javax.mail.Authenticator() {
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication("miconcorrenciaconectividademur@gmail.com", "concorrencia");
			}
		};

		Session mailSession = Session.getDefaultInstance(props, autenticador);
		mailSession.setDebug(false);
		Message msg = new MimeMessage(mailSession);

		msg.setSubject("Convite de Compromisso.");
		InternetAddress from = new InternetAddress("miconcorrenciaconectividademur@gmail.com");
		msg.setFrom(from);

		msg.setRecipients(Message.RecipientType.TO, address);
		msg.setContent(mensagem.toString(), "text/plain");
		Transport.send(msg);
	}

	public static void main(String[] args) throws Exception {
	}
}
